package com.market.controller;

import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.StpUtil;
import com.market.entity.User;
import com.market.model.dto.UpdateUserInfoDto;
import com.market.service.UserService;
import com.market.model.R;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 用户控制器
 * 处理用户相关操作，包括用户信息的获取、更新、密码修改和登出等功能
 * 除了特别标注的接口外，所有接口都需要用户登录后才能访问
 */
@RestController
@RequestMapping("/user")
@SaCheckLogin
public class UserController {
  @Autowired
  private UserService userService;
  
  /**
   * 用户登出操作
   * 清除当前用户的登录状态
   * @return 操作结果
   */
  @GetMapping("/logout")
  public R logout(){
    StpUtil.logout(StpUtil.getLoginId());
    return R.ok();
  }
  
  /**
   * 获取当前登录用户的信息
   * @return 当前用户的详细信息
   */
  @GetMapping("/getUserInfo")
  public R<User> getUserInfo() {
    return userService.getUserInfo();
  }
  
  /**
   * 根据用户ID获取用户信息
   * @param userId 用户ID
   * @return 指定用户的详细信息
   */
  @GetMapping("/getUserInfo/byId")
  public R<User> getUserInfo(String userId) {
    return userService.getUserInfo(userId);
  }

  /**
   * 更新用户基本信息
   * @param dto 包含需更新用户信息的数据传输对象
   * @return 操作结果
   */
  @PutMapping
  public R updateUserInfo(@RequestBody UpdateUserInfoDto dto){
    userService.updateUserInfo(dto);
    return R.ok();
  }
  
  /**
   * 更新用户密码
   * @param dto 包含新密码信息的数据传输对象
   * @return 操作结果
   */
  @PutMapping("/password")
  public R updateUserInfoPass(@RequestBody UpdateUserInfoDto dto) {
    userService.updateUserInfoDetail(dto);
    return R.ok();
  }
  
  /**
   * 获取所有用户列表
   * 此接口不需要登录即可访问
   * @return 返回所有用户的列表
   */
  @SaIgnore
  @GetMapping("/getUsers")
  public R getUsers() {
    List<User> users = userService.getUsers();
    return R.ok(users);
  }
}
